using System;
using System.Collections.Generic;
using Infragistics.UltraChart.Resources.Appearance;
using Infragistics.Win.UltraWinDataSource;
using Infragistics.Win.UltraWinGrid;

namespace PluginFrame
{
    public interface IPcrExperiment
    {
        TemperatureControlType TemperatureControlType { get; set; }

        double TubeVolume { get; set; }

        Dictionary<string, UltraGridColumn> ColumnConfiguration { get; set; }

        List<string> ColumnList { get; set; }

        List<IPcrModule> PcrModules { get; set; }

        double ReactionVolume { get; }

        string Name { get; set; }

        string TabDisplayName { get; set; }

        string ResultFile { get; set; }

        List<IProjectProperty> ProjectProjerties { get; set; }

        int AvailableChannelAmount { get; set; }

        bool[] IsChannelUsed { get; }

        List<ISubModule> SubModules { get; set; }

        int AmplificationStartCycle { get; set; }

        int AmplificationStopCycle { get; set; }

        int MeltingStartCycle { get; set; }

        int MeltingStopCycle { get; set; }

        bool IsWithMeltingCurveResult { get; set; }

        bool IsWithAmplificationResult { get; set; }

        List<string>[] DisplayedResultColumns { get; set; }

        PcrSystemType SystemType { get; set; }

        int IndexInTab { get; set; }

        IPcrProgram PcrProgram { get; set; }

        List<IPcrExperimentProject> Projects { get; }

        string Remark { get; set; }

        DateTime StartTime { get; set; }

        DateTime StopTime { get; set; }

        IRunningStatus RunningStatus { get; set; }

        PcrExperimentStatus Status { get; set; }

        bool HasPassword { get; set; }

        bool IsPasswordMatch { get; set; }

        string Password { get; set; }

        IPrintOption PrintOptions { get; set; }

        IPcrStructure PcrStructure { get; set; }

        PcrModuleState ModuleState { get; set; }

        bool IsAvailable { get; set; }

        bool IsDisplayed { get; set; }

        bool IsWithExperimentController { get; set; }

        List<int> TabIndexs { get; set; }

        int TabIndex { get; set; }

        List<string> CellSourceFileNames { get; set; }

        bool IsUseHotLid { get; set; }

        double HotLidSettingTemperature { get; set; }

        Guid Guid { get; }

        IStaffConfiguration Operator { get; set; }

        IStaffConfiguration Assessor { get; set; }

        string SoftwareVersion { get; set; }

        LightScanStyle LightScanStyle { get; set; }

        bool IsChanged { get; set; }

        bool AllProjectsReAnalysis { get; set; }

        bool IsDynamicAnalysis { get; set; }

        List<double> BlockTemperature { get; }

        List<double> HotLidTemperature { get; }

        List<double> TubeTemperature { get; }

        Dictionary<string, IPcrStandardCurve> CurrentImportStandardCurve { get; set; }

        string DefaultLabelString { get; set; }

        bool IsLabelSortIncrease { get; set; }

        int LabelStartValue { get; set; }

        int LabelInterval { get; set; }

        int LabelBits { get; set; }

        CellDisplaySortStyle CellDisplaySortStyle { get; set; }

        CellDisplaySortStyle MultiCellPlacementStyle { get; set; }

        bool IsHideParameterPanel { get; set; }

        IApplication MainApplication { get; set; }

        double SplitterVerticalRate { get; set; }

        double SplitterHorizontalRate { get; set; }

        CurveColorStyle CurveColorStyle { get; set; }

        bool RestartShowMeltingCurve { get; set; }

        bool RestartShowAmplificationCurve { get; set; }

        IPcrExperimentProject DefaultProject { get; set; }

        bool IsSkipDetectionSegment { get; set; }

        bool IsImportStandardCurve { get; set; }

        bool IsContinueHRM { get; }

        double HRMRamp { get; }

        void AddColumn(UltraGridColumn gridColumn);

        void RemoveColumn(string name);

        UltraGridColumn GetColumn(string name);

        UltraGridColumn[] GetGridColumnArray();

        int GetAvailableChannelCount();

        bool Analyze();

        void RealTimeAnalyze();

        void InitializeCellLightDataList();

        void AddCellLightDataCount(int newDataCount);

        UltraDataSource CreateCellMainDisplayTable(UltraDataSource oldTable);

        void CheckNewColumnExist();

        void SaveCellMainDisplayTable(UltraDataSource informationTable, ColumnsCollection gridColumns);

        UltraDataSource CreateCellInformationTable();

        void RefreshCellInforamtionInMainDisplayTable(UltraDataSource oldTable);

        void SaveCellInformationTable(UltraDataSource informationTable);

        bool CheckIsWithSample();

        bool RefreshCellTypeList();

        IAbsoluteAnalysisParameterConfiguration GetAnalysisOptions(string project, int channelIndex);

        List<IPcrCell> GetPcrCellsInExperiment();

        void SetAnalysisResult(IPcrExperimentProject project, int channelIndex, int targetIndex, IAnalysisResult analysisResult);

        IAnalysisResult GetAnalysisResult(IPcrExperimentProject project, int channelIndex, int targetIndex);

        IAnalysisResult[,] GetAnalysisResults(IPcrExperimentProject project);

        XYSeries[,] GetThresholdCurves(IPcrExperimentProject project);

        XYSeries[,] GetMeltingThresholdCurves(IPcrExperimentProject project);

        XYSeries[,] GetMeltingMinTemperatureCurves(IPcrExperimentProject project);

        XYSeries[,] GetMeltingMaxTemperatureCurves(IPcrExperimentProject project);

        void RefreshThresholdCurveLine(double value, IPcrExperimentProject project, int channelIndex, int targetIndex, bool isDisplay, bool setCurvesInvisible);

        void RefreshMeltingThresholdCurveLine(double value, IPcrExperimentProject project, int channelIndex, int targetIndex, bool isDisplay, bool setCurvesInvisible);

        void RefreshMeltingMinTemperatureCurveLine(double value, IPcrExperimentProject project, int channelIndex, int targetIndex, bool isDisplay, bool setCurvesInvisible);

        void RefreshMeltingMaxTemperatureCurveLine(double value, IPcrExperimentProject project, int channelIndex, int targetIndex, bool isDisplay, bool setCurvesInvisible);

        BoxAnnotation[] GetThresholdAnnotations(IPcrExperimentProject project);

        void DisplayThresholdCurves(IPcrExperimentProject project, int channelIndex, int targetIndex, bool isDisplay, bool setCurvesInVisible);

        void DisplayMeltingThresholdCurves(IPcrExperimentProject project, int channelIndex, int targetIndex, bool isDisplay, bool setCurvesInVisible);

        void DisplayMeltingMinTemperatureCurves(IPcrExperimentProject project, int channelIndex, int targetIndex, bool isDisplay, bool setCurvesInVisible);

        void DisplayMeltingMaxTemperatureCurves(IPcrExperimentProject project, int channelIndex, int targetIndex, bool isDisplay, bool setCurvesInVisible);

        bool CheckExperimentModuleCross(IPcrExperiment pcrExperiment);

        bool IsPcrCellIn(IPcrCell pcrCell);

        void AddSubModule(ISubModule subModule);

        void RemoveSubModule(ISubModule subModule);

        void UpdatePcrModuleStateBeforeExperiment();

        List<ISubModule> CheckExperimentRemovedSubModules();

        void ClearCellRealTimeCurve();

        List<string> GenerateColumnListFromConfiguration(Dictionary<string, UltraGridColumn> columnConfiguration);

        bool[] RefreshChannelUsed();

        bool FindSameProject(IPcrExperimentProject newProject, ref IPcrExperimentProject experimentProject);

        void ExportRawDataToExcel(int cycle, string fileName);

        bool CheckCellSubModuleInPcrExperiment(IPcrCell pcrCell);

        void AddBlockTemperature(double temperature);

        void AddHotLidTemperature(double temperature);

        void AddTubeTemperature(double temperature);

        int GetAllPcrCellCountWithProject();

        void Initialize(IApplication app);

        int GetActualAmplificationDetectionCycle();

        int GetActualMeltingDetectionCycle();

        void RefreshSubModulesBeforeNewFormClose();

        void RefreshColumnList();

        void ClearCellRowIndex();

        void InitializeExperimentCycleValue();
    }
}
